/**
 * # 参数列表实体类:
 *  Send - 发送新通知
 * 
 * # 描述:
 *  向指定的接收人列表发送一条通知消息。
 *  
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package com.waln.notifying.creating.args;

/**
 * 功能 发送新通知 的参数列表。
 */
@pittypat.FunctionAnnotation(transaction = true)
public final class Send extends pittypat.FunctionArgs {
	/**
	 * 发送用户的 Id。
	 * <p>
	 * 发送消息的用户的 Id，如果是系统消息，则为 null。
	 */
	@pittypat.ParameterAnnotation(position = 0, role = pittypat.ParameterRole.USER_ID)
	public java.util.UUID senderId;

	/**
	 * 接收人 Id 的列表。
	 * <p>
	 * 接收人 Id 的列表，多个之间使用 ',' 分隔。
	 */
	@pittypat.ParameterAnnotation(position = 1, maxLength = 20000)
	public String receivers;

	/**
	 * 紧急程度。
	 * <p>
	 * 通知的紧急程度代码：1-常规，2-紧急，4-特急。默认为常规（1）。
	 */
	@pittypat.ParameterAnnotation(position = 2)
	public Byte urgency;

	/**
	 * 分组。
	 * <p>
	 * 通知隶属的分组。
	 */
	@pittypat.ParameterAnnotation(position = 3, maxLength = 30)
	public String group;

	/**
	 * 通知标题。
	 * <p>
	 * 通知的标题。
	 */
	@pittypat.ParameterAnnotation(position = 4, maxLength = 50)
	public String title;

	/**
	 * 通知消息摘要。
	 * <p>
	 * 对通知消息正文的摘要信息。
	 */
	@pittypat.ParameterAnnotation(position = 5, maxLength = 200)
	public String summary;

	/**
	 * 通知正文内容。
	 * <p>
	 * 通知的完整正文内容。
	 */
	@pittypat.ParameterAnnotation(position = 6, maxLength = 200000)
	public String body;

	/**
	 * 正文类型代码。
	 * <p>
	 * 消息正文类型代码：1-纯文本，2-HTML。
	 */
	@pittypat.ParameterAnnotation(position = 7)
	public Byte bodyType;

	/**
	 * 目标功能路径。
	 * <p>
	 * 点击消息时要进入的路径。
	 */
	@pittypat.ParameterAnnotation(position = 8, maxLength = 300)
	public String funcUrl;

	/**
	 * 引用数据的类型。
	 * <p>
	 * 如果此消息来自某业务功能，则可能引用某业务数据，此属性定义业务数据的类型。
	 */
	@pittypat.ParameterAnnotation(position = 9, maxLength = 64)
	public String refDataType;

	/**
	 * 引用数据键值。
	 * <p>
	 * 消息引用数据的键值。
	 */
	@pittypat.ParameterAnnotation(position = 10, maxLength = 50)
	public String refDataKey;

	/**
	 * 附件 Id。
	 * <p>
	 * 通知消息的附件文件的数目。
	 */
	@pittypat.ParameterAnnotation(position = 11)
	public java.util.UUID attachmentId;

	/**
	 * 通知消息数目。
	 * <p>
	 * 成功发送的通知消息的数目。
	 */
	@pittypat.ParameterAnnotation(position = 12, direction = pittypat.ParameterDirection.OUT)
	public Integer notificationCount;

	/**
	 * 初始化 Send 类的一个新实例。
	 */
	public Send() {
		super();

		// 发送用户的 Id
		this.senderId = null;
		// 接收人 Id 的列表
		this.receivers = null;
		// 紧急程度
		this.urgency = null;
		// 分组
		this.group = null;
		// 通知标题
		this.title = null;
		// 通知消息摘要
		this.summary = null;
		// 通知正文内容
		this.body = null;
		// 正文类型代码
		this.bodyType = null;
		// 目标功能路径
		this.funcUrl = null;
		// 引用数据的类型
		this.refDataType = null;
		// 引用数据键值
		this.refDataKey = null;
		// 附件 Id
		this.attachmentId = null;
		// 通知消息数目
		this.notificationCount = null;
	}

	/**
	 * 获取指定名称的参数值。
	 * 
	 * @param name
	 * 			参数名称，不区分大小写。
	 * @return 指定名称的参数值。
	 */
	@Override
	public Object getParameterValue(String name) {
		if (name == null || name.length() == 0) {
			return null;
		}

		switch (name.toLowerCase()) {
			case "senderid":
				return this.senderId;
			case "receivers":
				return this.receivers;
			case "urgency":
				return this.urgency;
			case "group":
				return this.group;
			case "title":
				return this.title;
			case "summary":
				return this.summary;
			case "body":
				return this.body;
			case "bodytype":
				return this.bodyType;
			case "funcurl":
				return this.funcUrl;
			case "refdatatype":
				return this.refDataType;
			case "refdatakey":
				return this.refDataKey;
			case "attachmentid":
				return this.attachmentId;
			case "notificationcount":
				return this.notificationCount;
			default:
				return null;
		}
	}

	/**
	 * 设置指定名称的参数值。
	 * 
	 * @param name
	 * 			参数名称，不区分大小写。
	 * @param value
	 * 			参数值。
	 * 
	 * @throws IllegalArgumentException
	 */
	@Override
	public void setParameterValue(String name, Object value) throws IllegalArgumentException {
		if (name == null || name.length() == 0) {
			throw new IllegalArgumentException("没有提供有效的参数名称。");
		}

		switch (name.toLowerCase()) {
			case "senderid":
				this.senderId = (java.util.UUID) value;
				break;
			case "receivers":
				this.receivers = (String) value;
				break;
			case "urgency":
				this.urgency = (Byte) value;
				break;
			case "group":
				this.group = (String) value;
				break;
			case "title":
				this.title = (String) value;
				break;
			case "summary":
				this.summary = (String) value;
				break;
			case "body":
				this.body = (String) value;
				break;
			case "bodytype":
				this.bodyType = (Byte) value;
				break;
			case "funcurl":
				this.funcUrl = (String) value;
				break;
			case "refdatatype":
				this.refDataType = (String) value;
				break;
			case "refdatakey":
				this.refDataKey = (String) value;
				break;
			case "attachmentid":
				this.attachmentId = (java.util.UUID) value;
				break;
			case "notificationcount":
				this.notificationCount = (Integer) value;
				break;
			default:
				throw new IllegalArgumentException(name + " 不是 " + this.getClass().getName() + " 的有效参数属性名称。");
		}
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 * 			目标文本流。
	 * 
	 * @throws IllegalArgumentException
	 * @throws java.io.IOException
	 */
	@Override
	public void write(java.io.Writer writer) throws IllegalArgumentException, java.io.IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write('{');

		// 发送用户的 Id
		writer.write("\"senderId\":");
		pittypat.Json.write(writer, this.senderId);
		writer.write(',');

		// 接收人 Id 的列表
		writer.write("\"receivers\":");
		pittypat.Json.write(writer, this.receivers);
		writer.write(',');

		// 紧急程度
		writer.write("\"urgency\":");
		pittypat.Json.write(writer, this.urgency);
		writer.write(',');

		// 分组
		writer.write("\"group\":");
		pittypat.Json.write(writer, this.group);
		writer.write(',');

		// 通知标题
		writer.write("\"title\":");
		pittypat.Json.write(writer, this.title);
		writer.write(',');

		// 通知消息摘要
		writer.write("\"summary\":");
		pittypat.Json.write(writer, this.summary);
		writer.write(',');

		// 通知正文内容
		writer.write("\"body\":");
		pittypat.Json.write(writer, this.body);
		writer.write(',');

		// 正文类型代码
		writer.write("\"bodyType\":");
		pittypat.Json.write(writer, this.bodyType);
		writer.write(',');

		// 目标功能路径
		writer.write("\"funcUrl\":");
		pittypat.Json.write(writer, this.funcUrl);
		writer.write(',');

		// 引用数据的类型
		writer.write("\"refDataType\":");
		pittypat.Json.write(writer, this.refDataType);
		writer.write(',');

		// 引用数据键值
		writer.write("\"refDataKey\":");
		pittypat.Json.write(writer, this.refDataKey);
		writer.write(',');

		// 附件 Id
		writer.write("\"attachmentId\":");
		pittypat.Json.write(writer, this.attachmentId);
		writer.write(',');

		// 通知消息数目
		writer.write("\"notificationCount\":");
		pittypat.Json.write(writer, this.notificationCount);

		writer.write('}');
	}
}
